package com.cailu.rabmq.sender.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.cailu.common.constant.SenderConfFanoutExchangeCommon;

/**
 * @author cailu
 * @filename SenderConfExchangeConfig
 * @description 广播模式 Fanout Exchange –路由规则 也就是需要一对一的绑定到交换机上
 * @date 2020/3/31 17:18
 */
@Configuration
public class SenderConfFanoutExchangeConfig {

	/**
	 * Fanout Exchange – 不处理路由键。
	 * 你只需要简单的将队列绑定到交换机上。
	 * 一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
	 * 很像子网广播，每台网内的主机都获得了一份复制的消息。
	 * Fanout交换机转发消息是最快的。
	 */

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	/**
	 * 功能描述  创建 第一个 交换机
	 * @return org.springframework.amqp.core.Queue
	 * @author cailu
	 * @date 2020/3/31 17:22
	 */
	@Bean(name = "AMessage")
	public Queue queueAMessage() {
		logger.info("创建" + SenderConfFanoutExchangeCommon.FANOUT_A_EXCHANGE);
		return new Queue(SenderConfFanoutExchangeCommon.FANOUT_A_EXCHANGE);
	}

	/**
	 * 功能描述  创建 第二个 交换机
	 * @return org.springframework.amqp.core.Queue
	 * @author cailu
	 * @date 2020/3/31 17:22
	 */
	@Bean(name = "BMessage")
	public Queue queueBMessage() {
		logger.info("创建" + SenderConfFanoutExchangeCommon.FANOUT_B_EXCHANGE);
		return new Queue(SenderConfFanoutExchangeCommon.FANOUT_B_EXCHANGE);
	}

	/**
	 * 功能描述  创建 第三个 交换机
	 * @return org.springframework.amqp.core.Queue
	 * @author cailu
	 * @date 2020/3/31 17:23
	 */
	@Bean(name = "CMessage")
	public Queue queueCMessage() {
		logger.info("创建" + SenderConfFanoutExchangeCommon.FANOUT_C_EXCHANGE);
		return new Queue(SenderConfFanoutExchangeCommon.FANOUT_C_EXCHANGE);
	}

	/**
	 * 功能描述  配置广播路由器
	 * @return org.springframework.amqp.core.FanoutExchange
	 * @author cailu
	 * @date 2020/3/31 17:23
	 */
	@Bean
	public FanoutExchange fanoutExchange() {
		return new FanoutExchange(SenderConfFanoutExchangeCommon.FANOUT_EXCHANGE);
	}

	/**
	 * 功能描述  绑定 oneMessage 第一个 交换机
	 * @param queueAMessage  第一个 交换机
	 * @param fanoutExchange 广播路由器
	 * @return org.springframework.amqp.core.Binding
	 * @author cailu
	 * @date 2020/3/31 17:31
	 */
	@Bean
	public Binding bindingExchangeA(@Qualifier("AMessage") Queue queueAMessage, FanoutExchange fanoutExchange) {
		return BindingBuilder.bind(queueAMessage).to(fanoutExchange);
	}

	/**
	 * 功能描述  绑定 twoMessage 第二个 交换机
	 * @param queueBMessage  第二个 交换机
	 * @param fanoutExchange 广播路由器
	 * @return org.springframework.amqp.core.Binding
	 * @author cailu
	 * @date 2020/3/31 17:28
	 */
	@Bean
	public Binding bindingExchangeB(@Qualifier("BMessage") Queue queueBMessage, FanoutExchange fanoutExchange) {
		return BindingBuilder.bind(queueBMessage).to(fanoutExchange);
	}

	/**
	 * 功能描述  绑定 threeMessage 第三个 交换机
	 * @param queueCMessage  第三个 交换机
	 * @param fanoutExchange 广播路由器
	 * @return org.springframework.amqp.core.Binding
	 * @author cailu
	 * @date 2020/3/31 17:28
	 */
	@Bean
	public Binding bindingExchangeC(@Qualifier("CMessage") Queue queueCMessage, FanoutExchange fanoutExchange) {
		return BindingBuilder.bind(queueCMessage).to(fanoutExchange);
	}

}
